package cn.tedu.util;

import lombok.extern.slf4j.Slf4j;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;

/**
 * @author Kiven
 * @date 20240412
 */
@Slf4j
public class WeiXinUtil {





    /**
     * 发送https请求之获取临时素材
     * @param requestUrl
     * @param savePath  文件的保存路径，此时还缺一个扩展名
     * @return
     * @throws Exception
     */
    public static File getFile(String requestUrl,String savePath) throws Exception {
        // 创建SSLContext对象，并使用我们指定的信任管理器初始化  信任安全证书是一种由权威机构颁发的数字证书,用来证明网站或服务器的身份和安全性。
        // 在Java中，即使你使用信任的安全证书来访问一个网站，如果该网站本身不受信任（例如，其证书未被你的Java环境或操作系统所信任），那么你仍然可能无法成功访问该网站。
        //Java的安全机制是为了保护用户免受恶意网站和攻击的威胁。当Java尝试建立一个安全的网络连接时，它会检查服务器的证书是否被信任。如果证书不被信任，Java会抛出一个安全异常，阻止连接建立

        TrustManager[] tm = { new MyX509TrustManager() };
        SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
        sslContext.init(null, tm, new java.security.SecureRandom());
        // 从上述SSLContext对象中得到SSLSocketFactory对象
        SSLSocketFactory ssf = sslContext.getSocketFactory();

        URL url = new URL(requestUrl);

        //把代理加入请求链接
        HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
        httpUrlConn.setSSLSocketFactory(ssf);

        httpUrlConn.setDoOutput(true);
        httpUrlConn.setDoInput(true);
        httpUrlConn.setUseCaches(false);
        // 设置请求方式（GET/POST）
        httpUrlConn.setRequestMethod("GET");

        httpUrlConn.connect();

        //获取文件扩展名
        String ext = getExt(httpUrlConn.getContentType());
        //设置文件名
        savePath = savePath + System.currentTimeMillis() + ext;
        log.info("savePath:{}",savePath);
        //下载文件到f文件
        File file = new File(savePath);

        // 获取微信返回的输入流
        InputStream in = httpUrlConn.getInputStream();

        //输出流，将微信返回的输入流内容写到文件中
        FileOutputStream out = new FileOutputStream(file);

        int length=100*1024;
        byte[] byteBuffer = new byte[length]; //存储文件内容

        int byteread =0;
        int bytesum=0;

        while (( byteread=in.read(byteBuffer)) != -1) {
            bytesum += byteread; //字节数 文件大小
            out.write(byteBuffer,0,byteread);

        }
        log.info("bytesum:{}",bytesum);
        in.close();
        // 释放资源
        out.close();
        in = null;
        out=null;
        httpUrlConn.disconnect();
        return file;
    }



    /**
     * 发送https请求之获取临时素材
     * @param requestUrl
     * @param savePath  文件的保存路径，此时还缺一个扩展名
     * @return
     * @throws Exception
     */
    public static File getFile(String requestUrl,String savePath,String httpProxyHost,Integer httpProxyPort) throws Exception {
        // 创建SSLContext对象，并使用我们指定的信任管理器初始化
        TrustManager[] tm = { new MyX509TrustManager() };
        SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
        sslContext.init(null, tm, new java.security.SecureRandom());
        // 从上述SSLContext对象中得到SSLSocketFactory对象
        SSLSocketFactory ssf = sslContext.getSocketFactory();

        URL url = new URL(requestUrl);
        //创建代理服务器
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(httpProxyHost, httpProxyPort));
        //把代理加入请求链接
        HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection(proxy);
        httpUrlConn.setSSLSocketFactory(ssf);

        httpUrlConn.setDoOutput(true);
        httpUrlConn.setDoInput(true);
        httpUrlConn.setUseCaches(false);
        // 设置请求方式（GET/POST）
        httpUrlConn.setRequestMethod("GET");

        httpUrlConn.connect();

        //获取文件扩展名
        String ext = getExt(httpUrlConn.getContentType());
        //设置文件名
        savePath = savePath + System.currentTimeMillis() + ext;
        log.info("savePath:{}",savePath);
        //下载文件到f文件
        File file = new File(savePath);

        // 获取微信返回的输入流
        InputStream in = httpUrlConn.getInputStream();

        //输出流，将微信返回的输入流内容写到文件中
        FileOutputStream out = new FileOutputStream(file);

        int length=100*1024;
        byte[] byteBuffer = new byte[length]; //存储文件内容

        int byteread =0;
        int bytesum=0;

        while (( byteread=in.read(byteBuffer)) != -1) {
            bytesum += byteread; //字节数 文件大小
            out.write(byteBuffer,0,byteread);

        }
        log.info("bytesum:{}",bytesum);
        in.close();
        // 释放资源
        out.close();
        in = null;
        out=null;
        httpUrlConn.disconnect();
        return file;
    }

    /**
     * 获取文件扩展名
     * @param contentType
     * @return
     */
    private static String getExt(String contentType){
        System.out.println(contentType);
        if("image/jpeg".equals(contentType)){
            return ".jpg";
        }else if("image/png".equals(contentType)){
            return ".png";
        }else if("image/gif".equals(contentType)){
            return ".gif";
        }
        return null;
    }
}

